public class Autowired自动配置原理_依赖注入 {
    /*
    @Autowired自动配置原理(依赖注入)

    SpringBoot的自动配置就是当spring容器启动后，一些配置类、bean对象就自动存入到了IOC容器中，不需要我们手动去声明，从而简化了开发，省去了繁琐的配置操作。

    带有@SpringBootApplication注解的启动类会扫描自身所在包下全部类,将带有某些注解的类加入SpringIOC容器管理(如@Controller@Service@Mapper@Component@Bean等注解)


    但是常常出现待管理类与启动类不在同文件夹下的情况,诸如第三方类...
    这时就需要在启动类中使用一些注解来写明某个类要交给SpringIOC容器管理


    方案一：@ComponentScan 组件扫描
    @ComponentScan({"com.example","com.itheima"})//指定了Spring容器扫描包,但是应当注意指定其他包的同时,还应当把自己所在包写上去,否则不扫描
    @SpringBootApplication
    public class SpringbootWebConfig2Application {
    }
    当要扫描的包很多时写起来不方便

    方案二：@Import 导入。使用@Import导入的类会被Spring加载到IOC容器中，导入形式主要有以下几种：

    1.导入 普通类 或 配置类
    @Import({TokenParser.class, HeaderConfig.class})
    @SpringBootApplication
    public class SpringbootWebConfig2Application {
    }

    2.导入 ImportSelector 接口实现类 (ImportSelector是导入选择器用于批量导入要被管理的类,只要导入它一个类,当中被指定的类都被SpringIOC容器管理了)
    @Import({MyImportSelector.class})//在MyImportSelector类中,重写了selectImports方法,该方法返回的字符串数组内容是要Spring容器管理的那些类,可能是普通类,也可能是配置类,而配置类中又有@Bean注解引入的待管理第三方类,从而@Bean标注的哪些方法返回的第三方类对象就一同交给SpringIOC容器管理了
    @SpringBootApplication
    public class SpringbootWebConfig2Application {
    }


    3.当要管理的类很多时,使用@Import依然不方便写,这时候就需要用
    @EnableXXX注解，它封装@Import注解,XXX是变化的,通常该注解通常是由第三方jar包中提供的

    //EnableXXX接口一般由第三方jar包提供
    @Retention(RetentionPolicy.RUNTIME)//元注解相关
    @Target(ElementType.TYPE)//元注解相关
    @Import(MyImportSelector.class,Aselect.class,Bselect.class,Cselect.class,....)//用了EnableMyUserBean注解相当于引入MyImportSelector以及各种ImportSelector,无需程序员手动引入交给Spring管理
    public @interface EnableMyUserBean {
    }

    @EnableMyUserBean //使用第三方提供的@EnableXXX注解一次性导入多个ImportSelector
    @SpringBootApplication
    public class SpringbootWebConfig2Application {
    }
     */


}
